#include "mycam.h"
camera_fb_t *fb;


// 摄像头初始化函数
void camera_init() {
  // 摄像头配置
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sccb_sda = SIOD_GPIO_NUM;
  config.pin_sccb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 10000000;
  config.pixel_format = PIXFORMAT_JPEG;  // 使用JPEG格式
  config.frame_size = FRAMESIZE_HD;    // 降低分辨率
  config.jpeg_quality = 3;              // 降低JPEG质量，减少数据量
  config.fb_count = 2;                   // 使用双帧缓冲，提高性能

  // 初始化摄像头
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x\r\n", err);
    return;
  }

  // 获取摄像头传感器信息
  sensor_t *s = esp_camera_sensor_get();
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1);  // 图像垂直翻转
    s->set_brightness(s, 1);  // 增加亮度
    s->set_saturation(s, -2);  // 降低饱和度
  }
  else if (s->id.PID == OV5640_PID) {
      Serial.println("Found OV5640 camera");
      // 在这里设置 OV5640 的特定参数（例如亮度、对比度等）
      s->set_brightness(s, 1);  // 设置亮度
      s->set_contrast(s, 1);    // 设置对比度

  } else if (s->id.PID == OV2640_PID) {
      Serial.println("Found OV2640 camera");
      s->set_vflip(s, 0);  // 图像垂直翻转
      s->set_brightness(s, 1);  // 增加亮度
      s->set_saturation(s, -1);  // 降低饱和度
  } else {
      Serial.println("Camera not detected or not supported");
  }


}


// 图像捕获任务
void captureTask(void *pvParameters) {
  while (true) {
    // 获取一帧图像

    fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("获取摄像头帧失败");
      vTaskDelay(100 / portTICK_PERIOD_MS);
      continue;
    }

    // 确保图像数据为JPEG格式
    if (fb->format != PIXFORMAT_JPEG) {
      Serial.println("图像不是JPEG格式");
      esp_camera_fb_return(fb);
      vTaskDelay(100 / portTICK_PERIOD_MS);
      continue;
    }
    esp_camera_fb_return(fb);
    // // 将图像帧放入队列
    // if (xQueueSend(imageQueue, &fb, portMAX_DELAY) == pdPASS) {
    //   Serial.println("图像帧已放入队列");
    // } else {
    //   Serial.println("图像队列满，丢弃帧");
    //   esp_camera_fb_return(fb);
    // }

    vTaskDelay(500 / portTICK_PERIOD_MS);  // 等待1秒后捕获下一帧
  }
}


// 图像发送任务
void sendTask(void *pvParameters) {
  camera_fb_t *fb;
  while (true) {
    // 从队列中获取图像
    if (xQueueReceive(imageQueue, &fb, portMAX_DELAY) == pdPASS) {
      // 释放帧缓冲区
      esp_camera_fb_return(fb);
      vTaskDelay(100 / portTICK_PERIOD_MS);
    }

    vTaskDelay(10 / portTICK_PERIOD_MS);  // 短暂延迟，避免过载
  }
}